﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Prob_Distributions_ClassLibrary;


namespace tp5_colas
{
    class Montecarlo
    {
        public decimal Inv_Mensual { get; set; }
        public decimal Costo_Merc { get; set; }
        public decimal Precio_Vta { get; set; }
        public decimal Meses_A_Simular { get; set; }
        public decimal Cant_Merc_A_Comprar_X_Mes { get; set; }
        public System.Windows.Forms.DataGridView DgMontecarlo { get; set; } //grilla de pantalla para cargar
        private gridline linea_anterior;
        private gridline linea_actual;
        // Inicializo el objeto demanda para poder calcular una demanda dado un rnd
        private Eleccion demanda = new Eleccion();
        //Inicializo random_numbers con una semilla conocida para obtener siempre los mismos numeros aleatorios     
        private RandomNumber random_numbers = new RandomNumber((long)123, (long)1, (long)1, (long)1, (int)Utils.metodo.Nativo);

        public Montecarlo(decimal inv_mensual, decimal costo_merc, decimal precio_vta, decimal cant_merc_a_comprar, decimal meses_a_simular, System.Windows.Forms.DataGridView dgMontecarlo)
        {
            Inv_Mensual = inv_mensual;
            Costo_Merc = costo_merc;
            Precio_Vta = precio_vta;
            Meses_A_Simular = meses_a_simular;
            DgMontecarlo = dgMontecarlo;
            Cant_Merc_A_Comprar_X_Mes = cant_merc_a_comprar;                         
        }
        public void generarMontecarlo()
        {                        
            //Seteo de estado inicial            
            linea_anterior = new gridline(0,-1, 0, 0, 0, 0, 0, 0, 0, 0);
            //Agrego la cantidad de líneas necesarias para simular
            DgMontecarlo.Rows.Add((int)Meses_A_Simular);
            //Calcula cada línea
            for (int i =1 ; i <= Meses_A_Simular; i++)
            {
                linea_anterior = linea_actual?? linea_anterior;
                linea_actual = null;
                calcularLinea();
                cargarLinea(DgMontecarlo, linea_actual, i);                
            }



            /*
            List<decimal> lstRandoms = random_numbers.getNRandoms(100);

            foreach (decimal nr in lstRandoms)
            {
                d.getDemanda(nr);
            }

            gridline gl1 = new gridline();
            gl1.Reloj = 1;
            List<gridline> lst = new List<gridline>();
            lst.Add(gl1);

            DgMontecarlo.DataSource = lst;
            */

        }

        private void cargarLinea(System.Windows.Forms.DataGridView DgMontecarlo, gridline linea_actual)
        {
            throw new NotImplementedException();
        }

        private void calcularLinea()
        {
            //Logica para generar linea
            
            linea_actual = new gridline();
            linea_actual.Reloj = linea_anterior.Reloj + 1;            
            linea_actual.Rnd_Demanda = (int)(random_numbers.NextRandom()*100);
           // linea_actual.Demanda = eleccion.getEleccion(linea_actual.Rnd_Demanda);
            linea_actual.Cant_Comprada = this.Cant_Merc_A_Comprar_X_Mes;
            //calculo cantidad Vendida
            decimal stock_temporal = linea_actual.Cant_Comprada + linea_anterior.Stock;
            if (linea_actual.Demanda > stock_temporal)
            {
                //Tengo menos stock que demanda
                linea_actual.Cant_Vendida = stock_temporal;
                linea_actual.Stock = 0;
            }
            else
            {
                //Tengo más stock que demanda
                linea_actual.Cant_Vendida = linea_actual.Demanda;
                linea_actual.Stock = stock_temporal - linea_actual.Demanda;
            }

            linea_actual.Costo_Merc = linea_actual.Cant_Comprada * this.Costo_Merc;
            linea_actual.Cuota_Inversion = this.Inv_Mensual;
            linea_actual.Ventas = linea_actual.Cant_Vendida * this.Precio_Vta;
            linea_actual.Resultado_Mensual = linea_actual.Ventas - linea_actual.Costo_Merc - linea_actual.Cuota_Inversion;
            linea_actual.Resultado_Acumulado = linea_actual.Resultado_Mensual + linea_anterior.Resultado_Acumulado;
        }

        private void cargarLinea(System.Windows.Forms.DataGridView dg, gridline line, int i)
        {
            i -= 1;                                    
            dg["Reloj", i].Value = line.Reloj;
            dg["Rnd_Demanda", i].Value=line.Rnd_Demanda;
            dg["Demanda", i].Value = line.Demanda.ToString();
            dg["Cant_Comprada", i].Value = line.Cant_Comprada;
            dg["Cant_Vendida", i].Value = line.Cant_Vendida;
            dg["Stock", i].Value = line.Stock;
            dg["Costo_Merc", i].Value = line.Costo_Merc;
            dg["Cuota_Inv", i].Value = line.Cuota_Inversion;
            dg["Ventas", i].Value = line.Ventas;
            dg["Res_Mensual", i].Value = line.Resultado_Mensual;
            dg["Res_Acum", i].Value = line.Resultado_Acumulado;            
        }
    }
}
    